﻿using System.Collections.Generic;

namespace Algorytm
{
    public class Algorytm_Czworka
    {
        public int typ, numer, dzien, godzina;
        public int war_flaga = 0; //1 mozna miec zajecia -1 nie mozna
        public int dlugosc;

        public Algorytm_Czworka()
        {
        }

        public Algorytm_Czworka(int _typ, int _numer, int _dzien, int _godzina, int flaga)
        {
            typ = _typ;
            numer = _numer;
            godzina = _godzina;
            dzien = _dzien;
            war_flaga = flaga;
        }

        public Algorytm_Czworka(int _typ, int _numer, int _dzien, int _godzina, int _dlugosc, int flaga)
        {
            typ = _typ;
            numer = _numer;
            godzina = _godzina;
            dzien = _dzien;
            war_flaga = flaga;
            dlugosc = _dlugosc;
        }

        public void dodaj(int _typ, int _numer, int _dzien, int _godzina, int flaga)
        {
            typ = _typ;
            numer = _numer;
            godzina = _godzina;
            dzien = _dzien;
            war_flaga = flaga;
        }
    }

    public class Algorytm_Wierzcholek
    {
        public int poziom;
        public bool odwiedzony;
        public int pozycja_w_liscie;
        public Algorytm_Krawedz krawedz_dodajaca;
        public int wartosc1; //dla poziom1 numer klasy; dla poziom2 numer nauczciela; dla poziom3 numer sali;
        public int wartosc2; //dla poziomu1 laczna ilosc godzin w tygodniu; dla poziom 2 numer przedmiotu; dla poziomu 3 dzien tygodnia
        public int wartosc3; // dla poziomu 3 godzina
        public List<Algorytm_Krawedz> krawedzie;
        public int skojarzenie1;
        public int skojarzenie2;
        public int A, B, C;
        public List<Algorytm_Czworka> obecnie_rozwazane;
        public bool podwojny;

        public void ustaw_ABC(int a, int b, int c)
        {
            A = a;
            B = b;
            C = c;
        }

        public void ustaw_BC(int b, int c)
        {
            B = b;
            C = c;
        }

        public void czysc_zmienne()
        {
            odwiedzony = false;
            A = B = C = -1;
        }

        public void skojarz(int sk1, int sk2)
        {
            skojarzenie1 = sk1;
            skojarzenie2 = sk2;
        }

        private void Standard()
        {
            skojarzenie1 = skojarzenie2 = -1;
            krawedzie = new List<Algorytm_Krawedz>();
            obecnie_rozwazane = new List<Algorytm_Czworka>();
            podwojny = false;
        }

        public void Czysc()
        {
            obecnie_rozwazane.Clear();
        }

        public void zmien_liste(List<Algorytm_Czworka> lista)
        {
            obecnie_rozwazane.Clear();
            obecnie_rozwazane = lista;
        }

        public void dodaj_do_rozwazanych(int typ, int numer, int dzien, int godzina, int flaga)
        {
            if (!Usun_z_rowazanych(typ, numer, dzien, godzina, -flaga))
                obecnie_rozwazane.Add(new Algorytm_Czworka(typ, numer, dzien, godzina, flaga));
        }

        public void dodaj_do_rozwazanych(int typ, int numer, int dzien, int godzina, int dlugosc, int flaga)
        {
            if (!Usun_z_rowazanych(typ, numer, dzien, godzina, dlugosc, -flaga))
                obecnie_rozwazane.Add(new Algorytm_Czworka(typ, numer, dzien, godzina, dlugosc, flaga));
        }

        public bool Sprawdz_czy_jest_w_rozwazanych(int typ, int numer, int dzien, int godzina, int flaga)
        {
            foreach (var item in obecnie_rozwazane)
            {
                if (item.typ == typ && item.numer == numer && item.dzien == dzien && item.godzina == godzina && item.war_flaga == flaga)
                    return true;
            }
            return false;
        }

        public bool Sprawdz_czy_jest_w_rozwazanych(int typ, int numer, int dzien, int godzina, int dlugosc, int flaga)
        {
            foreach (var item in obecnie_rozwazane)
            {
                if (item.typ == typ && item.numer == numer && item.dzien == dzien && item.godzina == godzina && item.war_flaga == flaga && item.dlugosc == dlugosc)
                    return true;
            }
            return false;
        }

        public bool Usun_z_rowazanych(int typ, int numer, int dzien, int godzina, int flaga)
        {
            int i = 0;
            Algorytm_Czworka a;
            bool usuwam = false;
            for (; i < obecnie_rozwazane.Count; i++)
            {
                a = obecnie_rozwazane[i];
                if (a.typ == typ && a.dzien == dzien && a.godzina == godzina && a.numer == numer && a.war_flaga == flaga)
                {
                    usuwam = true;
                    break;
                }
            }
            if (usuwam)
                obecnie_rozwazane.RemoveAt(i);
            return usuwam;
        }

        public bool Usun_z_rowazanych(int typ, int numer, int dzien, int godzina, int dlugosc, int flaga)
        {
            int i = 0;
            Algorytm_Czworka a;
            bool usuwam = false;
            for (; i < obecnie_rozwazane.Count; i++)
            {
                a = obecnie_rozwazane[i];
                if (a.typ == typ && a.dzien == dzien && a.godzina == godzina && a.numer == numer && a.war_flaga == flaga && a.dlugosc == dlugosc)
                {
                    usuwam = true;
                    break;
                }
            }
            if (usuwam)
                obecnie_rozwazane.RemoveAt(i);
            return usuwam;
        }

        public Algorytm_Wierzcholek()
        {
            Standard();
        }

        public Algorytm_Wierzcholek(int poziom_wierzcholka)
        {
            poziom = poziom_wierzcholka;
            Standard();
        }

        public Algorytm_Wierzcholek(int poziom_wierzcholka, int pozycja, int numer)
        {
            pozycja_w_liscie = pozycja;
            poziom = poziom_wierzcholka;
            wartosc1 = numer;
            Standard();
        }

        public Algorytm_Wierzcholek(int poziom_wierzcholka, int pozycja, int numer_pierwszy, int numer_drugi)
        {
            pozycja_w_liscie = pozycja;
            poziom = poziom_wierzcholka;
            wartosc1 = numer_pierwszy;
            wartosc2 = numer_drugi;
            Standard();
        }

        public Algorytm_Wierzcholek(int poziom_wierzcholka, int pozycja, int numer_pierwszy, int numer_drugi, int numer_trzeci)
        {
            pozycja_w_liscie = pozycja;
            poziom = poziom_wierzcholka;
            wartosc1 = numer_pierwszy;
            wartosc2 = numer_drugi;
            wartosc3 = numer_trzeci;
            Standard();
        }
    }
}